package thread;
/**
 * 多线程并发安全问题
 * 当多个线程并发操作同一临界资源时，由于线程切换的时机不确定，导致操作过程的顺序
 * 错乱，出现严重的后果。
 * 临界资源:同时只能被单个线程操作的资源。
 * 
 * @author 范传奇
 *
 */
public class SyncDemo1 {
	public static void main(String[] args) {
		Table table = new Table();
		Thread t1 = new Thread() {
			public void run() {
				while(true) {
					int bean = table.getBean();
					Thread.yield();
					System.out.println(getName()+":"+bean);
				}
			}
		};
		Thread t2 = new Thread() {
			public void run() {
				while(true) {
					int bean = table.getBean();
					Thread.yield();
					System.out.println(getName()+":"+bean);
				}
			}
		};
		t1.start();
		t2.start();
	}
}

class Table{
	private int beans = 20;//桌子上有20个豆子
	/**
	 * 当一个方法被synchronized修饰后，该方法称为同步方法，即：多个线程不能同时
	 * 在方法内部执行。将异步调用方法改为同步调用可以解决并发安全问题。
	 * @return
	 */
	public synchronized int getBean() {
		if(beans==0) {
			throw new RuntimeException("没有豆子了!");
		}
		Thread.yield();
		return beans--;
	}
}








